968
4036
На этот вопрос уже есть ответы:
Нет неявного преобразования в перегруженном операторе
(2 ответа)
Закрыт 7 лет назад.
Я пишу простую оболочку для элементарного типа и стараюсь не писать слишком много разновидностей стандартных операторов. Я надеялся, что неявное преобразование типов поможет, но это не помогло. Вот урезанный пример:
struct Int
{
int _i;
Int (int i = 0): _i {i} {}
Оператор Int + (const Int & rhs) {return _i + rhs._i;}
};
int main (int argc, char * argv [])
{
(пусто) (Инт (1) + 2); // Отлично
(пусто) (2 + Инт (1)); // ошибка: недопустимые операнды для двоичного выражения ('int' и 'Int')
}
Я использую llvm. Первая строка main компилируется нормально. Второй вызывает ошибку. Я надеялся, что во второй строке произойдет неявное преобразование 2 в Int (2) с последующим вызовом оператора +. Почему этого не происходит? Почему неявное преобразование происходит в первой строке? 
Это происходит в первой строке, потому что единственный доступный оператор + - это оператор + (Int &) (который имеет неявный первый параметр Int для этого экземпляра). Вторая строка терпит неудачу, потому что первый параметр - это int, и он не знает, что ему нужно преобразовать его перед попыткой операции (он не знает, что ему нужно использовать Int :: operator +).
Вы можете избежать этой проблемы, сделав оператор функцией друга, не являющейся членом (http://ideone.com/YCf7wX)
struct Int
{
int _i;
Int (int i = 0): _i {i} {}
друг Int оператор + (const Int & lhs, const Int & rhs);
};
Оператор Int + (const Int & lhs, const Int & rhs)
{
return lhs._i + rhs._i;
}
int main ()
{
Int i;
я + 5;
5 + я;
возврат 0;
}
|
Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками c ++ operator-keyword implicit-conversion или задайте свой вопрос.